package com.ljx.buildMode;

/**
 * 建造者模式
 *
 * 应用场景：
 * 1、相同的方法，不同的执行顺序，产生不用的结果时
 * 2、多个部件或者零件，都可以装配到一个对象中，但是产生的结果又不相同
 * 3、产品非常复杂，或者产品类中的调用顺序不用产生不同的作用
 * 4、当时初始化一个对象特别复杂，参数多，而且很多参数都具有默认值时
 *
 * 建造者模式的优点：
 * 1、封装性好，创建和使用分离；
 * 2、扩展性好，建造类之间独立、一定程度上解耦。
 * 建造者模式的缺点：
 * 1、产生多余的Builder对象；
 * 2、产品内部发生变化，建造者都要修改，成本较大。
 *
 * 经典案例：
 * JDK的StringBuffer及StringBuilder
 * MyBatis中的SqlSessionFactoryBuilder
 * Spring中的BeanDefinitionBuilder
 *
 * @作者 LJX
 * @日期 2022/12/20 14:03
 */
public class ProductTest {

    public static void main(String[] args) {
        Product build = new Product.Builder().attr1("111").attr2("222").attr3("333").attr4("444").attr5("555").build();
        System.out.println(build);
    }

}


class Product{

    private final String attr1;
    private final String attr2;
    private final String attr3;
    private final String attr4;
    private final String attr5;

    Product(String attr1, String attr2, String attr3, String attr4, String attr5) {
        this.attr1 = attr1;
        this.attr2 = attr2;
        this.attr3 = attr3;
        this.attr4 = attr4;
        this.attr5 = attr5;
    }

    @Override
    public String toString() {
        return "Product{" +
                "attr1='" + attr1 + '\'' +
                ", attr2='" + attr2 + '\'' +
                ", attr3='" + attr3 + '\'' +
                ", attr4='" + attr4 + '\'' +
                ", attr5='" + attr5 + '\'' +
                '}';
    }

    /**
     * 构建器
     */
    static class Builder{
        private String attr1;
        private String attr2;
        private String attr3;
        private String attr4;
        private String attr5;

        //链式调用

        public Builder attr1(String attr1){
            this.attr1 = attr1;
            return this;
        }
        public Builder attr2(String attr2){
            this.attr2 = attr2;
            return this;
        }
        public Builder attr3(String attr3){
            this.attr3 = attr3;
            return this;
        }
        public Builder attr4(String attr4){
            this.attr4 = attr4;
            return this;
        }
        public Builder attr5(String attr5){
            this.attr5 = attr5;
            return this;
        }

        Product build(){
            return new Product(attr1,attr2,attr3,attr4,attr5);
        }

    }

}


